"""
    功能接口，目前只支持26个post请求类型的主要接口，后续会更新
    已经使用api全局变量构建了一个类对象
"""
import requests as requests
import json


class WxInterface:
    def _req_post(self, url: str, data: str) -> str:
        """
        向指定网址发送一个post请求
        :param url: 欲请求的网址
        :param data: post提交的数据
        :return: 请求返回值，字符串类型
        """
        _req = requests.post(url=url, data=data)
        return _req.text

    # todo 0000， 微信状态检测
    def dect_wx_state(self, wxport: int):
        """
        微信状态检测，通过注入时设定的微信端口来获取该端口所对应微信的登录状态
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0000", "data": {}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0001，发送文本消息
    def send_text_msg(self, wxport: int, to_wxid: str, msg: str) -> str:  # 发送文本信息
        """
        发送文本消息
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param to_wxid: 要发送对象的wxid
        :param msg: 要发送的文本内容，支持文本代码，详情请查阅Daen官方接口数据
        :return: 返回请求后的提示信息，用来自行解析操作结果
        :type: str
        """
        _data: dict = {"type": "Q0001", "data": {"wxid": to_wxid, "msg": msg}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0002，修改图片下载时间
    def set_down_img_time(self,wxport: int, time: str):
        """
        修改图片下载时间
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param time: 下载时间，“23:30-23:30”为全天下载，“00:01-23:59”为全天不下载，格式必须正确
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0002", "data": {"type": time}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0003， 获取个人信息
    def check_wx_msg(self, wxport: int):
        """
        获取端口所对应微信的信息
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :return: 返回请求后的个人信息，json文本类型，自行解析操作结果
        """
        _data = {"type": "Q0003", "data": {}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0004， 查询指定对象信息
    def check_obj_msg(self, wxport: int, check_wxid: str):
        """
        查询指定对象的数据信息，支持好友、群聊、公众号
        :param check_wxid: 查询对象的wxid
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0004", "data": {"wxid": check_wxid}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0005，获取好友列表
    def get_friend_list(self, wxport: int, type: int):
        """
        获取微信的好友列表
        :param type: 获取列表的方式：1=从缓存中获取，2=重新遍历二叉树并刷新缓存
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0005", "data": {"type": str(type)}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0006，获取群聊列表
    def get_group_list(self, wxport: int, type: int):
        """
        获取微信的好友列表
        :param type: 获取列表的方式：1=从缓存中获取，2=重新遍历二叉树并刷新缓存
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0006", "data": {"type": str(type)}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0007，获取公众号列表
    def get_app_list(self, wxport: int, type: int):
        """
        获取微信的好友列表
        :param type: 获取列表的方式：1=从缓存中获取，2=重新遍历二叉树并刷新缓存
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0007", "data": {"type": str(type)}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0008，获取群成员列表
    def get_group_member_list(self, wxport: int, get_wxid: str):
        """
        获取群聊成员列表
        :param get_wxid: 要获取群聊的wxid
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0008", "data": {"wxid": get_wxid}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0009，发送聊天记录
    def send_chat_record(self, wxport: int, to_wxid: str, title: str, data_list: tuple):
        """
        发送聊天记录
        :param data_list: 要发送的聊天记录信息，传入一个元组，每条信息使用一个字典存储起来，需要包含wxid、nickname、timestamp（发送消息时的时间戳，十位）、信息内容四个key
        :param title: 发送聊天记录的大标题
        :param to_wxid: 要发送对象的wxid
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0009", "data": {"wxid": to_wxid, "title": title, "dataList": data_list}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0010，发送图片消息
    def send_image(self, wxport: int, to_wxid: str, img_path: str) -> str:
        """
        发送图片消息
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param to_wxid: 要发送对象的wxid
        :param img_path: 要发送的图片路径，可以是本地路径或者是网络直链
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data: dict = {"type": "Q0010", "data": {"wxid": to_wxid, "path": img_path}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0011，发送本地文件
    def send_file(self, wxport: int, to_wxid: str, file_path: str) -> str:
        """
        发送本地文件
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param to_wxid: 要发送对象的wxid
        :param file_path: 要发送的本地文件路径，必须是绝对路径
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data: dict = {"type": "Q0011", "data": {"wxid": to_wxid, "path": file_path}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0012，发送分享链接
    def send_share_url(self, wxport: int, to_wxid: str, title: str, content: str, jumpurl: str, img_path: str,
                       app: str = None):
        """
        发送分享链接
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param to_wxid: 要发送对象的wxid
        :param title: 分享链接标题
        :param content: 分享链接提示信息
        :param jumpurl: 点击跳转地址
        :param app: 分享的APPID，可空，例如QQ浏览器为：wx64f9cf5b17af074d
        :param img_path: 分享链接的图片地址，可以为本地路径或者网络直链
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """

        _data = {"type": "Q0012",
                 "data": {"wxid": to_wxid, "title": title, "content": content, "jumpUrl": jumpurl, "app": app,
                          "path": img_path}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0013，发送小程序卡片
    def send_small_app(self, wxport: int, to_wxid: str, title: str, content: str, jump_path: str, gh: str,
                       img_path: str):
        """
        发送小程序卡片
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param to_wxid: 要发送对象的wxid
        :param title: 标题
        :param content: 提示信息
        :param jump_path: 分享链接的图片地址，可以为本地路径或者网络直链
        :param gh: 小程序ID，例如饿了么为：gh_6506303a12bb
        :param img_path: 分享链接的图片地址，可以为本地路径或者网络直链
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {
            "type": "Q0013",
            "data": {
                "wxid": to_wxid,
                "title": title,
                "content": content,
                "jumpPath": jump_path,
                "gh": gh,
                "path": img_path
            }
        }
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0014，发送音乐分享
    def send_music_share(self, wxport: int, to_wxid: str, name: str, author: str, app: str, jumpurl: str, musicurl: str,
                         imgurl: str):
        """
        发送音乐分享
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param to_wxid: 要发送对象的wxid
        :param name: 音乐名字
        :param author: 音乐作者
        :param app: 音乐ID，例如：酷狗/wx79f2c4418704b4f8，网易云/wx8dd6ecd81906fd84，QQ音乐/wx5aa333606550dfd5
        :param jumpurl: 点击跳转地址
        :param musicurl:  网络歌曲直链
        :param imgurl: 分享链接的图片地址，可以为本地路径或者网络直链
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0014",
                 "data": {"wxid": to_wxid, "name": name, "author": author, "app": app, "jumpUrl": jumpurl,
                          "musicUrl": musicurl, "imageUrl": imgurl}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0015，发送xml卡片
    def send_xml(self, wxport: int, to_wxid: str, xml_data: str):
        """
        发送xml卡片
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param to_wxid: 要发送对象的wxid
        :param xml_data: xml数据
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0015", "data": {"wxid": to_wxid, "xml": xml_data}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0016，确认收款
    def confirm_receipt(self, wxport: int, wxid: str, transferid: str):
        """
        确认转账收款
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param wxid: 转账方的wxid
        :param transferid: 转账ID
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0016", "data": {"wxid": wxid, "transferid": transferid}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0017，同意好友请求
    def agree_friend_req(self, wxport: int, scene: str, v3: str, v4: str):
        """
        同意好友请求
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param scene: 来源
        :param v3: 请求的v3数据
        :param v4: 请求的v4数据
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0017", "data": {"scene": scene, "v3": v3, "v4": v4}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0018，通过v3添加好友
    def add_friend_from_v3(self, wxport: int, scene: str, v3: str, type: int, content: str):
        """
        同意好友请求
        :param content: 验证信息
        :param type: 1=新朋友，2=互删朋友（此时来源将固定死为3）
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param scene: 添加来源，1=qq 3=微信号 6=单向添加 10和13=通讯录 14=群聊 15=手机号 17=名片 30=扫一扫
        :param v3: 请求的v3数据
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0018", "data": {"v3": v3, "content": content, "scene": scene, "type": type}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0019，通过wxid添加好友
    def add_friend_from_wxid(self, wxport: int, scene: str, add_wxid: str, content: str):
        """
        同意好友请求
        :param wxid: 要添加好友的wxid
        :param content: 验证信息
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param scene: 添加来源，1=qq 3=微信号 6=单向添加 10和13=通讯录 14=群聊 15=手机号 17=名片 30=扫一扫
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0019", "data": {"wxid": add_wxid, "content": content, "scene": scene}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0020，查询陌生人信息
    def get_stranger_msg(self, wxport: int, pq: str):
        """
        查询陌生人信息
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param pq: 陌生人的手机号或者QQ
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0020", "data": {"pq": pq}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0021，邀请进群
    def invite_join_group(self, wxport: int, group_wxid: str, friend_wxid: str, type: int):
        """
        邀请进群
        :param type: 整数型，1=直接拉，2=发送邀请链接
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param group_wxid: 进群的wxid
        :param friend_wxid: 被邀请好友的wxid
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0021", "data": {"wxid": group_wxid, "objWxid": friend_wxid, "type": type}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0022，删除好友
    def del_friend(self, wxport: int, del_wxid: str):
        """
        删除好友
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param del_wxid: 要删除的好友的wxid
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0022", "data": {"wxid": del_wxid}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0023，修改对象备注
    def modify_obj_remark(self, wxport: int, obj_wxid: str, remark: str):
        """
        修改对象备注
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param obj_wxid: 要修改对象的wxid，支持好友和群聊
        :param remark: 要设置的备注名，支持emoji、微信表情
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0023", "data": {"wxid": obj_wxid, "remark": remark}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0024，修改群聊名称
    def modify_group_name(self, wxport: int, group_wxid: str, name: str):
        """
        修改群聊名称，部分群聊只有群主和管理员可以修改
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param group_wxid: 要修改群聊的wxid
        :param name: 要修改成的名字支持emoji、微信表情
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0024", "data": {"wxid": group_wxid, "nick": name}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0025，发送名片xml
    def send_card(self, wxport: int, to_wxid: str, card_xml: str):
        """
        发送名片xml，不懂得可以自己看Daen文档或者给机器人微信发一个查看xml代码
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :param to_wxid: 要发送对象的wxid
        :param card_xml: 名片xml代码
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0025", "data": {"wxid": to_wxid, "xml": card_xml}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req

    # todo 0026，获取登录二维码
    def get_login_qrcode(self, wxport: int):
        """
        获取登录二维码，具体用处不知道，自测
        :param wxport: 在注入时为注入的微信设定的端口，整数型
        :return: 返回请求后的提示信息，用来自行解析操作结果
        """
        _data = {"type": "Q0026", "data": {}}
        _req: str = self._req_post('http://127.0.0.1:' + str(wxport) + '/DaenWxHook/client/', json.dumps(_data))
        return _req


# 构建一个类对象
api = WxInterface()

if __name__ == "__main__":
    api = WxInterface()
    result = api.get_login_qrcode(8055)
    print(result)
